package com.itheima.manager;

import com.itheima.autoconfig.sms.SmsTemplate;
import com.itheima.domain.db.Admin;
import com.itheima.service.db.AdminService;

import com.itheima.util.ConstantUtil;
import com.itheima.util.JwtUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.HashMap;

@Service
public class UserManager {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private SmsTemplate smsTemplate;

    @Reference
    private AdminService adminService;


    // 发送验证码
    public void sendSms(String telephone) {
        // 1. 生成验证码
        // String code = RandomUtil.randomNumbers(6);
        String code ="123456";  // 验证码(开发阶段写死)

        // 2. 发送验证码
        // smsTemplate.sendSms(telephone,code);
        System.out.println(code);

        // 3. 保存验证码到redis
        stringRedisTemplate.opsForValue().set(ConstantUtil.SMS_CODE + telephone,code, Duration.ofMinutes(5));
    }

    // 登录校验
    public String login(String telephone, String code) {
        // 获取redis中的验证码
        String codeFromRedis = stringRedisTemplate.opsForValue().get(ConstantUtil.SMS_CODE + telephone);
        // 校验验证码
        if (!StringUtils.equals(code,codeFromRedis)){
            //比对失败
            return "0";  // 验证码错误
        }
        //比对成功
        stringRedisTemplate.delete(ConstantUtil.SMS_CODE + telephone);//比对成功，删除验证码

        //查询手机号
        Admin admin = adminService.findByPhone(telephone);
        // 校验手机号
        if (admin == null){
            return "1";  // 手机号输入有误
        }

        //创建token
        HashMap<String, Object> tokenMap = new HashMap<>();
        tokenMap.put("id", admin.getId());
        tokenMap.put("phone", admin.getPhone());
        String token = JwtUtil.createToken(tokenMap);
        //将token保存到redis                                                       //value是什么不重要，到时候只看有没有这个key==>token
        stringRedisTemplate.opsForValue().set(ConstantUtil.USER_TOKEN + token, "1", Duration.ofDays(7));

        return token;  // 验证通过 并 返回token
    }

    // 根据当前登录手机号查询管理员信息(数据回显)
    public Admin adminInfoByTelephone(String telephone) {
        return adminService.findByPhone(telephone);
    }
}
